diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
new file mode 100644
index 0000000..9cfe959
--- /dev/null
+++ b/system/libraries/Zip.php
@@ -0,0 +1,154 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * Zip Compression Class
+ *
+ * This class is based on a library aquired at Zend:
+ * http://www.zend.com/codex.php?id=696&single=1
+ *
+ * I'm not sure this library is all that reliable, but it's the only
+ * zip compressor I'm aware of -- Rick Ellis
+ * 
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @category	Encryption
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/general/encryption.html
+ */
+class Zip {
+
+    var $zdata  = array();
+    var $cdir   = array();
+    var $offset = 0;
+
+	/**
+	 * Add a Directory
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+    function add_dir($name)
+    {
+        $name =str_replace ("\\", "/", $name);
+        
+        $fd = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"    
+              .pack("V", 0)
+              .pack("V", 0)
+              .pack("V", 0)
+              .pack("v", strlen($name))
+              .pack("v", 0)
+              .$name;
+        
+        $this->cdata[] = $fd;
+                
+        $cd = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+              .pack("V", 0)
+              .pack("V", 0)
+              .pack("V", 0)
+              .pack("v", strlen ($name))
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("V", 16)
+              .pack("V", $this->offset)
+              .$name;
+        
+        $this->offset = strlen(implode('', $this->cdata));
+        
+        $this->cdir[] = $cd;
+    }
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Add a File
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+    function add_file($data, $name)
+    {
+        $name = str_replace("\\", "/", $name);
+        
+        $u_len = strlen($data);
+        $crc   = crc32($data);
+        $data  = gzcompress($data);
+        $data  = substr(substr($data, 0,strlen ($data) - 4), 2);
+        $c_len = strlen($data);
+        
+        $fd = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+              .pack("V", $crc)
+              .pack("V", $c_len)
+              .pack("V", $u_len)
+              .pack("v", strlen($name))
+              .pack("v", 0)
+              .$name
+              .$data
+              .pack("V", $crc)
+              .pack("V", $c_len)
+              .pack("V", $u_len);
+        
+        $this->zdata[] = $fd;
+                
+        $cd = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+              .pack("V", $crc)
+              .pack("V", $c_len)
+              .pack("V", $u_len)
+              .pack("v", strlen ($name))
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("v", 0)
+              .pack("V", 32 )
+              .pack("V", $this->offset)
+              .$name;
+  
+        $this->offset = strlen(implode('', $this->zdata));
+        
+        $this->cdir[] = $cd;
+    }
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Output the zip file
+	 *
+	 * @access	public
+	 * @return	string
+	 */	
+    function output_zipfile()
+    {
+        $data = implode("", $this->zdata);
+        $cdir = implode("", $this->cdir);
+
+        return   $data
+                .$cdir
+                ."\x50\x4b\x05\x06\x00\x00\x00\x00"
+                .pack("v", sizeof($this->cdir))
+                .pack("v", sizeof($this->cdir))
+                .pack("V", strlen($cdir))
+                .pack("V", strlen($data))
+                ."\x00\x00";
+    }
+
+}
+// END CLASS
+?>
\ No newline at end of file
